// /**
//  ****************************************************************************************************
//  * @file        my_spiffs.c
//  * @author      正点原子团队(ALIENTEK)
//  * @version     V1.0
//  * @date        2025-01-01
//  * @brief       SPIFFS驱动测试代码
//  * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
//  ****************************************************************************************************
//  * @attention
//  *
//  * 实验平台:正点原子 ESP32-S3 开发板
//  * 在线视频:www.yuanzige.com
//  * 技术论坛:www.openedv.com
//  * 公司网址:www.alientek.com
//  * 购买地址:openedv.taobao.com
//  *
//  ****************************************************************************************************
//  */

// #include "spiffs.h"

// #define WRITE_DATA              "ALIENTEK ESP32-S3"     /* 写入数据 */

// static const char *spiffs_tag = "spiffs";

// /**
//  * @brief       spiffs初始化
//  * @param       partition_label:分区表的分区名称
//  * @param       mount_point:文件系统关联的文件路径前缀
//  * @param       max_files:可以同时打开的最大文件数
//  * @retval      ESP_OK:成功; ESP_FAIL:失败
//  */
// esp_err_t spiffs_init(char *partition_label, char *mount_point, size_t max_files)
// {
//     size_t total = 0;   /* SPIFFS总容量 */
//     size_t used = 0;    /* SPIFFS已使用的容量 */
    
//     esp_vfs_spiffs_conf_t spiffs_conf = {           /* 配置spiffs文件系统的参数 */
//         .base_path              = mount_point,      /* 磁盘路径,比如"0:","1:" */
//         .partition_label        = partition_label,  /* 分区表的分区名称 */
//         .max_files              = max_files,        /* 最大可同时打开的文件数 */
//         .format_if_mount_failed = true,             /* 挂载失败则格式化文件系统 */
//     };

//     esp_err_t ret = esp_vfs_spiffs_register(&spiffs_conf);  /* 初始化和挂载SPIFFS分区 */
//     if (ret != ESP_OK)
//     {
//         if (ret == ESP_FAIL)
//         {
//             ESP_LOGE(spiffs_tag, "Failed to mount or format filesystem");
//         }
//         else if (ret == ESP_ERR_NOT_FOUND)
//         {
//             ESP_LOGE(spiffs_tag, "Failed to find SPIFFS partition");
//         }
//         else
//         {
//             ESP_LOGE(spiffs_tag, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret));
//         }

//         return ESP_FAIL;
//     }

//     ret = esp_spiffs_info(spiffs_conf.partition_label, &total, &used);  /* 获取SPIFFS的总容量和已使用的容量 */
//     if (ret != ESP_OK)
//     {
//         ESP_LOGI(spiffs_tag, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret));
//     }
//     else
//     {
//         ESP_LOGI(spiffs_tag, "Partition size: total: %d Bytes, used: %d Bytes", total, used);
//     }

//     return ret;
// }

// /**
//  * @brief       注销spiffs
//  * @param       partition_label:分区表的分区名称
//  * @retval      ESP_OK:注销成功; 其他:失败
//  */
// esp_err_t spiffs_deinit(char *partition_label)
// {
//     return esp_vfs_spiffs_unregister(partition_label);
// }

// /**
//  * @brief       测试spiffs
//  * @param       无
//  * @retval      无
//  */
// esp_err_t spiffs_test_write(void)
// {
//     char buffer[256];
//     int i;  
//     size_t written_bytes = 0;

//     ESP_LOGI("spiffs_test", "Opening file");
        
//     FILE *file_obj = fopen("/spiffs/hello.txt", "w");   /* 建立一个名为/spiffs/hello.txt的只写文件 */
//     if (file_obj == NULL)
//     {
//         ESP_LOGE("spiffs_test", "Failed to open file for writing");
//     }

//     for (i = 0; i < 20 * 1024; i++) {
//         buffer[i % 256] = '1' + (i % 9);  // 循环写入1-9
        
//         // 当缓冲区满或达到目标大小时写入文件
//         if ((i + 1) % 256 == 0 || (i + 1) >= 20 * 1024) {
//             size_t write_size = (i + 1) % 256;
//             if (write_size == 0) write_size = 256;
            
//             size_t w = fwrite(buffer, 1, write_size, file_obj);
//             if (w != write_size) {
//                 ESP_LOGI("sd_write_test_data", "文件写入失败");
//                 fclose(file_obj);
//                 return ESP_FAIL;
//             }
//             written_bytes += w;
//         }
//     }
//     fclose(file_obj);                   /* 关闭文件 */
//     ESP_LOGI("spiffs_test", "File written");
    
//     return ESP_OK;
// }

// /**
//  * @brief       测试spiffs
//  * @param       无
//  * @retval      无
//  */
// esp_err_t spiffs_test_read(uint8_t *buffer, size_t buffer_size, size_t *bytes_read, uint32_t offset)
// {
//     // char buffer[256];
//     // int i;  
//     // size_t written_bytes = 0;

//     // ESP_LOGI("spiffs_test", "Opening file");
        
//     FILE *file_obj = fopen("/spiffs/hello.txt", "r");   /* 建立一个名为/spiffs/hello.txt的只写文件 */
//     if (file_obj == NULL)
//     {
//         ESP_LOGE("spiffs_test", "Failed to open file for reading");
//     }

//         // 设置读取偏移量
//     if (fseek(file_obj, offset, SEEK_SET) != 0) {
//         ESP_LOGI("sd_read_file_data", "设置文件偏移量失败");
//         fclose(file_obj);
//         return ESP_FAIL;
//     }
    
//     // 读取数据
//     *bytes_read = fread(buffer, 1, buffer_size, file_obj);
//     fclose(file_obj);

//     return ESP_OK;
// }

// /**
//  * @brief       测试spiffs
//  * @param       无
//  * @retval      无
//  */
// void spiffs_test(void)
// {
//     ESP_LOGI("spiffs_test", "Opening file");
    
//     FILE *file_obj = fopen("/spiffs/hello.txt", "w");   /* 建立一个名为/spiffs/hello.txt的只写文件 */
//     if (file_obj == NULL)
//     {
//         ESP_LOGE("spiffs_test", "Failed to open file for writing");
//     }

//     fprintf(file_obj, WRITE_DATA);      /* 写入字符 */
//     fclose(file_obj);                   /* 关闭文件 */
//     ESP_LOGI("spiffs_test", "File written");

//     /* 重命名之前检查目标文件是否存在 */
//     struct stat st;
//     if (stat("/spiffs/foo.txt", &st) == 0)  /* 获取文件信息，获取成功返回0 */
//     {
//         /*  从文件系统中删除一个名称。
//             如果名称是文件的最后一个连接，并且没有其它进程将文件打开，
//             名称对应的文件会实际被删除。 */
//         unlink("/spiffs/foo.txt");
//     }
 
//     /* 重命名创建的文件 */
//     ESP_LOGI("spiffs_test", "Renaming file");
//     if (rename("/spiffs/hello.txt", "/spiffs/foo.txt") != 0)
//     {
//         ESP_LOGE("spiffs_test", "Rename failed");
//     }
 
//     /* 打开重命名的文件并读取 */
//     ESP_LOGI("spiffs_test", "Reading file");
//     file_obj = fopen("/spiffs/foo.txt", "r");
//     if (file_obj == NULL)
//     {
//         ESP_LOGE("spiffs_test", "Failed to open file for reading");
//     }

//     char line[64];
//     fgets(line, sizeof(line), file_obj);    /* 从指定的流中读取数据 */
//     fclose(file_obj);
    
//     char *pos = strchr(line, '\n'); /* 指针pos指向第一个找到‘\n’ */
//     if (pos)
//     {
//         *pos = '\0';                /* 将‘\n’替换为‘\0’ */
//     }

//     ESP_LOGI("spiffs_test", "Read from file: '%s'", line);
// }
